#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6,maxe=1e6;
struct linkList {
    typedef struct {int u,v,w,next;} edge;
    edge e[maxe];
    int h[maxn],edge_cnt=0;
    linkList(){	//构造函数
        edge_cnt=0;
        memset(h,-1,sizeof(h));
    }
    //遍历点u 周围点
    template<typename U>
    void for_each(int u,U func){
        for(int i = h[u] ; i !=-1;i = e[i].next)
            func(e[i].u,e[i].v,e[i].w); //u v w
    }
    void add(int u,int v,int w=0){
        e[edge_cnt] = {u,v,w,h[u]};
        h[u] = edge_cnt++;
    }
    void add2(int u,int v,int w=0){
        add(u,v,w);
        add(v,u,w);
    }
    edge& operator[](int i){
        return e[i];
    }
    void sort(){
        std::sort(e,e+edge_cnt,[](edge &e1,edge& e2){ return e1.w < e2.w; });
    }
} e;

template<std::size_t size>
struct Kahn {
private:
    int indegree[size];       //存点的入度的
    int seq[size],seq_cnt=0; //排序好的序列
    int sta[size],scnt=0;
    linkList &e; // linkList的引用

    inline void push(int a) { sta[scnt++] = a;}
    inline int pop() { return sta[--scnt];}

public:
    Kahn(linkList &e): e{e} {}
    // 点u对应的入度加1
    inline void degree_add_one(int u) { ++indegree[u];}
    void print() {
        for( auto & u : *this) {
            cout << u <<" ";
        }  
    }

    auto begin() { return &seq[0]; }
    auto end() { return &seq[seq_cnt];}

     /**
     * n : 最大的那个点的编号
     * 最小点的编号默认是1
     * return bool 表示是否有环
     */
    bool work(int n){
        //把所有入度为0的点入栈
        for(int i =1;i<=n;++i)
            if( !indegree[i]) push(i);
        int cnt = 0; //表示 删除的点的数量
        while( scnt !=0 ){ //当我们的栈非空时，一直操作
            int u = pop();
            seq[seq_cnt++] = u; //加入排序
            for(int i = e.h[u] ;~i ;i = e[i].next) {
                int v = e[i].v;
                if( --indegree[v] == 0 )
                    push(v);
            }
            cnt++; // 取出栈一个点，计数
        }
        if(cnt != n) // 不可以topo sort ,表示有环图
            return 0;
        return 1;
    }
};

Kahn<maxn>  kahn(e);
int main()
{
    int n,m;
    cin >> n>> m;
    for(int i =1;i<=m;i++){
        int u,v;
        cin >> u >> v;
        kahn.degree_add_one(v);
        e.add(u,v);
    }
    bool ans = kahn.work(n);
    cout << "ans " << ans << endl;
    
    for( auto & u : kahn) {
        cout << u <<" ";
    }
    

    return 0;
}